//设计101序列检测器
//制作者：FPGA研究者
//时间：2022年7月3日

module fsm_seq101(clk,rst,in,q);
    input clk,rst,in;
	 output reg q;
	 reg [2:0] state,next_state;
	 parameter s0=2'b00,s1=2'b01,s2=2'b11,s3=2'b10;//状态编码，采用格雷码编码方式

	 always@(posedge clk or negedge rst) begin  //定义状态
	 if(!rst) state<=s0;
	 else state<=next_state;
	 end
	 
	 always@(state or in) begin   // 米里型状态机，手现态和输入信号影响,状态转换
	 case(state)
	   s0:begin if(in)  next_state=s1;
		         else  next_state=s0;  end
	   s1:begin if(in)  next_state=s1;
		         else  next_state=s2;  end
	   s2:begin if(in)  next_state=s3;
		         else  next_state=s0;  end
	   s3:begin if(in)  next_state=s1;
		         else  next_state=s2;  end
					
		default:next_state=s0;
	endcase
   end
	
	always@(state)begin //输出状态
	  case(state)
	     s3: q=1;
		  default: q=0;
		 endcase
  end
  endmodule
		
	 
	 
